New version of image.scale function
[This article was first published on me nugget, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
Below is an updated version of the image.scale function. In the old version, one had to constantly use additional arguments to suppress axes and their labels. The new version contains the additional arguments axis.pos (1, 2, 3, or 4) for defining the side of the axis, and add.axis (TRUE or FALSE), for defining whether the axis is plotted. Based on the position of the axis, the scale color levels are automatically drawn in a horizontal (axis.pos = 1[bottom] or 3[top]) or vertical (axis.pos = 2[left] or 4[right]) orientation. For the right plot above, the argument add.axis=FALSE so that additional control over axis ticks and labels could be added in an additional step with axis(). The function mtext() can be used to add additional labels to the scale.
The image.scale function:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#This function creates a color scale for use with the image() | |
#function. Input parameters should be consistent with those | |
#used in the corresponding image plot. The "axis.pos" argument | |
#defines the side of the axis. The "add.axis" argument defines | |
#whether the axis is added (default: TRUE)or not (FALSE). | |
image.scale <- function(z, zlim, col = heat.colors(12), | |
breaks, axis.pos=1, add.axis=TRUE, ...){ | |
if(!missing(breaks)){ | |
if(length(breaks) != (length(col)+1)){stop("must have one more break than colour")} | |
} | |
if(missing(breaks) & !missing(zlim)){ | |
breaks <- seq(zlim[1], zlim[2], length.out=(length(col)+1)) | |
} | |
if(missing(breaks) & missing(zlim)){ | |
zlim <- range(z, na.rm=TRUE) | |
zlim[2] <- zlim[2]+c(zlim[2]-zlim[1])*(1E-3)#adds a bit to the range in both directions | |
zlim[1] <- zlim[1]-c(zlim[2]-zlim[1])*(1E-3) | |
breaks <- seq(zlim[1], zlim[2], length.out=(length(col)+1)) | |
} | |
poly <- vector(mode="list", length(col)) | |
for(i in seq(poly)){ | |
poly[[i]] <- c(breaks[i], breaks[i+1], breaks[i+1], breaks[i]) | |
} | |
if(axis.pos %in% c(1,3)){ylim<-c(0,1); xlim<-range(breaks)} | |
if(axis.pos %in% c(2,4)){ylim<-range(breaks); xlim<-c(0,1)} | |
plot(1,1,t="n",ylim=ylim, xlim=xlim, axes=FALSE, xlab="", ylab="", xaxs="i", yaxs="i", ...) | |
for(i in seq(poly)){ | |
if(axis.pos %in% c(1,3)){ | |
polygon(poly[[i]], c(0,0,1,1), col=col[i], border=NA) | |
} | |
if(axis.pos %in% c(2,4)){ | |
polygon(c(0,0,1,1), poly[[i]], col=col[i], border=NA) | |
} | |
} | |
box() | |
if(add.axis) {axis(axis.pos)} | |
} |
To reproduce the example:
To leave a comment for the author, please follow the link and comment on their blog: me nugget.
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.